package test0302;

import java.util.Scanner;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * 编写程序判断一个给定的关系R是否是等价关系。
 * 输入：输入的关系中的每个元素均为自然数;
 * 输出：R是否是等价关系
 */
@SuppressWarnings({"all"})
public class Main01 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入关系矩阵的维数: ");
        int N = scanner.nextInt();
        System.out.println("请输入该关系矩阵: ");
        int[][] arr = new int[N][N];
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                arr[i][j] = scanner.nextInt();
            }
        }
        boolean reflexivity = reflexivity(arr);
        System.out.println("是否具有自反性: " + reflexivity);

        boolean symmetry = symmetry(arr);
        System.out.println("是否具有对称性: " + symmetry);

        boolean transmissibility = transmissibility(arr);
        System.out.println("是否具有传递性: " + reflexivity);

        if (reflexivity && symmetry && transmissibility){
            System.out.println("是等价关系~~~");
        }

    }

    // 判断是否具有自反性
    // 关系矩阵对角线（左上到右下）均为1；
    public static boolean reflexivity(int[][] arr){
        boolean flag = true;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (i == j && arr[i][j] != 1){
                    flag = false;
                    break;
                }
            }
        }
        return flag;
    }

    // 判断是否具有对称性
    // 若关系矩阵arr[i][j] == 1 则 arr[j][i] == 1;
    public static boolean symmetry(int[][] arr){
        boolean flag = true;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] == 1 && arr[j][i] != 1){
                    flag = false;
                    break;
                }
            }
        }
        return flag;
    }

    // 判断是否具有对称性
    // 利用矩阵表示方法，遍历这个矩阵如果遇到一个等于1的位置，记录位置，
    // 利用其纵坐标当下一个数的横坐标，在此横坐标下找到是1的位置，记录这个位置，在利用上一个数位置的横坐标和这个数的纵坐标找到一个新的位置，
    // 如果这个位置上是1，那么这个数就具有可传递性，然后继续遍历进行这个循环操作，知道检查到所有的数都对上了，这个二元关系才可说具有可传递性，
    // 有一个不符的都不是可传递性的二元关系。
    public static boolean transmissibility(int[][] arr) {
        boolean flag = true;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] == 1){
                    for (int k = 0; k < arr[j].length; k++) {
                        if (arr[j][k] == 1 && arr[i][k] != 1){
                            flag = false;
                            break;
                        }
                    }
                }
            }
        }
        return flag;
    }
}
